<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('attendance_summary', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 汇总维度
            $table->string('summary_type', 20); // daily, weekly, monthly, yearly
            $table->date('summary_date'); // 汇总日期
            $table->string('period', 20)->nullable(); // 2024-01, 2024-W01, 2024-Q1, 2024

            // 部门信息
            $table->unsignedBigInteger('department_id')->nullable();
            $table->string('department_name', 100)->nullable();
            $table->string('department_code', 50)->nullable();

            // 员工统计
            $table->integer('total_employees')->default(0); // 应出勤总人数
            $table->integer('actual_attendance')->default(0); // 实际出勤人数
            $table->integer('present_count')->default(0); // 正常出勤
            $table->integer('late_count')->default(0); // 迟到人数
            $table->integer('early_leave_count')->default(0); // 早退人数
            $table->integer('absent_count')->default(0); // 缺勤人数
            $table->integer('leave_count')->default(0); // 请假人数
            $table->integer('overtime_count')->default(0); // 加班人数

            // 考勤详情
            $table->integer('no_clock_in_count')->default(0); // 未打卡人数
            $table->integer('incomplete_clock_count')->default(0); // 打卡不完整人数
            $table->integer('location_exception_count')->default(0); // 位置异常人数
            $table->integer('makeup_clock_count')->default(0); // 补卡人数

            // 时间统计
            $table->decimal('total_work_hours', 10, 2)->default(0); // 总工作时长
            $table->decimal('total_overtime_hours', 10, 2)->default(0); // 总加班时长
            $table->decimal('total_late_minutes', 10, 2)->default(0); // 总迟到分钟数
            $table->decimal('total_early_leave_minutes', 10, 2)->default(0); // 总早退分钟数

            // 率值统计
            $table->decimal('attendance_rate', 5, 2)->nullable(); // 出勤率
            $table->decimal('on_time_rate', 5, 2)->nullable(); // 准时率
            $table->decimal('absent_rate', 5, 2)->nullable(); // 缺勤率

            // 请假统计
            $table->integer('annual_leave_count')->default(0); // 年假人数
            $table->integer('sick_leave_count')->default(0); // 病假人数
            $table->integer('personal_leave_count')->default(0); // 事假人数
            $table->integer('other_leave_count')->default(0); // 其他假人数

            // 状态管理
            $table->string('status', 20)->default('draft'); // draft, confirmed, final
            $table->datetime('confirmed_at')->nullable();
            $table->string('confirmed_by', 100)->nullable();

            // 备注
            $table->text('notes')->nullable();

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['summary_type', 'summary_date'], 'as_type_date_idx');
            $table->index(['department_id', 'summary_date'], 'as_dept_date_idx');
            $table->index(['period'], 'as_period_idx');
            $table->index(['status'], 'as_status_idx');
            $table->index(['attendance_rate'], 'as_att_rate_idx');

            // 外键约束
            $table->foreign('department_id')->references('id')->on('departments')->onDelete('set null');

            // 唯一约束：同一部门、同一汇总类型、同一日期只能有一条记录
            $table->unique(['department_id', 'summary_type', 'summary_date'], 'unique_dept_summary');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('attendance_summary');
    }
};
